home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / qex / qexbert / dbert.asm < prev    next >
Assembly Source File  |  1995-02-14  |  16KB  |  792 lines

  1. *
  2. * 9600-baud (G3RUH) BER test routines, with SINAD measurement
  3. *
  4. * Copyright (c) 1994, American Radio Relay League, Inc.
  5. * All Rights Reserved
  6. *
  7. * J. Bloom, KE3Z
  8. * 17 November, 1994
  9. *
  10. ;-----------------------------------------------------------;
  11. AIC_1    .set    00A14h  ;RA =TA = 5  0000101000010100 = 00A14h
  12. AIC_2    .set    00025h  ;TA'=0 RA'= 9  0000000000100101 = 00025h
  13. ;AIC_2    .set    00205h  ;TA'=1 RA'= 1  000000100000000101 = 00205h
  14. AIC_3    .set    0346ah  ;RB =TB =1Ah 0011010001101010 = 0346ah
  15. AIC_CMD    .set    00083h  ;   COMMAND  0000000010000011 = 00083h
  16. TEMP    .set    060h
  17. BITLEN    .set    066h
  18.     .ds    0600h
  19. ;
  20. ; Interrupt vector jump address location
  21. jvect    .set    0fae0h
  22. jvect+2    .set    0fae2h
  23. ; DSK_COMM routines
  24. DRECV    .set    0fa16h
  25. DXMIT    .set    0fa1ah
  26. tmp1    .word    0
  27. shift    .word    0
  28. shift1    .word    0
  29. sstate    .word    0
  30. y1    .word    0
  31. bstate    .word    0
  32. MYBITL    .word    0fbh
  33. func    .word    0
  34. resp    .word    0
  35. smpdly    .word    0
  36. sdly    .word    17    ; Sample delay
  37. flags    .word    0
  38. *
  39. * Flag bit definitions
  40. *
  41. *    15    1 = Calib signal, 0 = bit stream
  42. *    14    Respond with next sample value
  43. *    13    Start-up delay active
  44. *    12    Action flag--next sample is center of data bit
  45. *    11    BER test running
  46. *    10    4/8-byte response
  47. *    9    8-byte response
  48. *    8    Generate Test signal
  49. clkcmd    .word    0
  50. xsamp    .word    0
  51. rsamp    .word    0
  52. sudly    .word    0
  53. tmp0    .word    0
  54. invert    .word    0
  55. one    .word    1
  56. rvect    .word    0fae0h
  57. outbit    .word    0
  58. outbit+1    .word    0
  59. errcnt    .word    0
  60. errcnt+1    .word    0
  61. tcount    .word    0
  62. tcount+1    .word    0
  63. g-1    .word    0
  64. g-2    .word    0
  65. ;gc2    .q14    0.320956
  66. gc2    .q14    0.597127
  67. prnofs    .Q15    -0.164    ; DC offset, PRN case
  68. clkjit    .word    0
  69.  
  70. ; Calibration function
  71. STUP    .set    0    ; Startup state
  72. CWAIT    .set    1    ; Settling time wait state
  73. SMPSCN    .set    2    ; Scan for sample delay
  74. DLYSCN    .set    3    ; Scan for clock advance/retard
  75. ; Calibraton constants
  76. CALW    .set    1920    ; # samples to wait for settling
  77. ;----------------------------------------------------------------
  78. ;    SECONDARY VECTOR TABLE LOACTED IN B0 PROGRAM RAM
  79. ;----------------------------------------------------------------
  80.         .include  "mmregs.asm"  ;     > USERCODE SHOULD NOT OVERWRITE DSKD  <
  81.         .ps     0fa00h          ;     > VECTORS.  ON LOAD, INT2 IS RESTORED <
  82.         B       start           ;RS   > BY DSKD, BUT TRAP IS NOT            <
  83.         B       start           ;INT0
  84.         B       start           ;INT1
  85.         B       start           ;INT2  > DSKD LOAD IGNORES INT2 VECTOR
  86.         B       start           ;TINT
  87.         B       RINT        ;RINT  Branch to receive interrupt routine
  88.         eint                    ;XINT  XINT is only for timing, so just return
  89.         ret                     ;
  90.     .ps    0fae0h
  91. riber    b    berri        ; BER interrupt
  92. risin    b    sinadi        ; SINAD interupt
  93.       ; Begin TRAP/DSKD Kernal  ;DSKD load does not restore this code!
  94. ;----------------------------------------------------------------
  95. ;    APPLICATION CODE IS LOCATED ABOVE DSKD KERNAL
  96. ;----------------------------------------------------------------
  97.     .ps    0FB00h
  98.     .entry
  99. start:    ldpk    0        ; All direct addressing is to MMRs and B2
  100.     fort    0        ; Serial port : 16 bit
  101.     rtxm            ;             : ext. FSX
  102.     sfsm            ;             ; burst mode
  103.     lack    080h        ; AIC reset by pulsing /BR (Global Data)
  104.     sach    DXR        ; send 0 to DXR (AIC)
  105.     sacl    GREG        ; 256 * 100 nS /BR pulse
  106.     lrlk    AR0,0FFFFh
  107.     rptk    255        ; read junk from address 0xFFFF
  108.     lac    *,0,AR0
  109.     conf    2
  110.     sovm            ; catch accumulator overflows
  111.  
  112. * Uncomment the following three lines to pick up the
  113. * serial port speed from DSK_COMM
  114. ;    lac    BITLEN
  115. ;    ldpk    12
  116. ;    sacl    MYBITL
  117.     ldpk    0
  118. ;--------------------------------
  119. AIC_RS  lack    024h            ; Turn on XINT
  120.         sacl    IMR             ;
  121.         idle                    ;
  122.         lalk    AIC_1           ; Load each AIC configuration word
  123.         call    AIC_2nd         ; and load it into the AIC
  124.         lalk    AIC_2           ;
  125.         call    AIC_2nd         ;
  126.         lalk    AIC_3           ;
  127.         call    AIC_2nd         ;
  128.         lalk    AIC_CMD         ;
  129.         call    AIC_2nd         ;
  130. ;----------------------------------------------------------------
  131.     rsxm
  132.  
  133.     ldpk    12
  134.     zac
  135.     sacl    IMR
  136.     b    runit
  137.  
  138. ; Receive and respond to new command
  139.  
  140. docmd:    ldpk    12
  141.     call    RECV        ; Get function command from host
  142.     sacl    func        ; Save function ID
  143.     subk    043h        ; C = calib
  144.     bnz    docmd0
  145.     lac    flags
  146.     ork    1
  147.     sacl    flags
  148.     b    runit
  149. docmd0    lac    func
  150.     subk    049h        ; I = Idle
  151.     bnz    docmd1
  152.     lalk    0ff6eh        ; Reset calib and reporting flags
  153.     b    icmd
  154. docmd1    lac    func
  155.     subk    034h        ; 4,5 = BER test
  156.     bz    ord4
  157.     subk    1
  158.     bnz    docmd2
  159.     lalk    0186ah,4    ; = 100000
  160.     b    setord
  161. ord4    lalk    10000
  162. setord    sach    tcount
  163.     sacl    tcount+1
  164.     lalk    20000        ; Set startup delay
  165.     sacl    sudly
  166.     zac
  167.     sacl    errcnt
  168.     sacl    errcnt+1
  169.     lac    flags
  170.     ork    010h        ; Set BER reporting flag
  171.     sacl    flags
  172.     lalk    0ff7eh
  173. icmd    and    flags
  174.     sacl    flags
  175.     b    runit
  176. docmd2    lac    func        ; + = increment sdly
  177.     subk    02bh
  178.     bnz    docmd3
  179.     lac    sdly
  180.     addk    1
  181.     sacl    sdly
  182.     b    runit
  183. docmd3    lac    func        ; - = decrement sdly
  184.     subk    02dh
  185.     bnz    docmd4
  186.     lac    sdly
  187.     subk    1
  188.     bz    runit        ; Don't go below 1
  189.     sacl    sdly
  190.     b    runit
  191. docmd4:    lac    func        ; V = report value
  192.     subk    056h
  193.     bnz    docmd5
  194.     lac    flags
  195.     ork    2
  196.     sacl    flags
  197.     lalk    20000
  198.     sacl    sudly
  199.     b    runit
  200. docmd5:    lac    func        ; A = advance rx clock
  201.     subk    041h
  202.     bnz    docmd6
  203.     lack    2
  204.     sacl    clkcmd
  205.     b    runit
  206. docmd6:    lac    func        ; R = retard rx clock
  207.     subk    052h
  208.     bnz    docmd7
  209.     lack    1
  210.     sacl    clkcmd
  211.     b    runit
  212. docmd7:    lac    func
  213.     subk    030h        ; 0 = normal data, 1 = invert data
  214.     bz    setinv
  215.     subk    1
  216.     bnz    docmd8
  217.     lack    1
  218. setinv    sacl    invert
  219.     b    runit
  220. docmd8    lac    func        ; N = 1-kHz siNe wave
  221.     subk    04eh
  222.     bnz    docmd9
  223.     zac
  224.     b    docmd9a
  225. docmd9    lac    func        ; S = SINAD measurement
  226.     subk    053h
  227.     bnz    docmd10
  228.     lalk    8192
  229. docmd9a    sacl    tcount
  230.     lalk    20000
  231.     sacl    sudly
  232.     zac
  233.     sacl    resp
  234.     sacl    y1
  235.     sacl    sstate
  236.     sacl    sumn
  237.     sacl    sumn+1
  238.     sacl    sumsn
  239.     sacl    sumsn+1
  240. ; Init oscillator
  241.     sacl    g-2
  242.     lac    gc2
  243.     sacl    g-1
  244.     lalk    jvect+2
  245.     sacl    rvect
  246.     b    stint        ; Start interrupts
  247. docmd10    lac    func        ; D = report debug value
  248.     subk    044h
  249.     bnz    docmd11
  250.     lac    sdly        ; Value to report
  251.     call    XMIT16
  252.     b    waity
  253. docmd11    lac    func        ; T = test signal
  254.     subk    054h
  255.     bnz    docmd12
  256.     lac    flags
  257.     andk    0ffeeh        ; Clear calib and BER bits
  258.     ork    080h        ; Set test signal bit
  259.     sacl    flags
  260.     b    runit
  261. docmd12    lac    func        ; Q = quiet
  262.     subk    051h
  263.     bnz    docmd13
  264.     zac
  265.     ldpk    0
  266.     sacl    DXR
  267.     ldpk    12
  268.     b    waity
  269. docmd13:
  270. ; Init variables
  271. runit:    zac
  272.     sacl    resp        ; No response yet
  273.     sacl    bstate        ; Start in bit state 0
  274.     sacl    y1        ; Init IIR filter storage
  275.     lack    1        ; Start in sample state 1
  276.     sacl    sstate
  277.     lalk    jvect        ; BER interrupt processing
  278.     sacl    rvect
  279. ; Enable RINTs to start processing
  280. stint:
  281.     ldpk    0
  282.     lack    010h            ; AIC RINT
  283.     sacl    IMR             ; where INT0 indicates EOC (End Of Conv)
  284. ; Idle loop. Just processes RINTs until BIO goes low (incoming
  285. ; command from host) or a response is generated by the interrupt
  286. ; processing routine.
  287. AGN:    idle
  288.     ldpk    12
  289.     bioz    docomm        ; Host wants a response
  290.     lac    resp        ; Need to send a response?
  291.     bz    AGN        ; No, loop
  292. ; Here to send delayed response and await another command
  293.     ldpk    0
  294.     zac
  295.     sacl    IMR
  296.     ldpk    12
  297.     lac    resp
  298.     call    XMIT16
  299.     bit    flags,10    ; 4/8-byte response?
  300.     bbz    waity
  301.     lac    errcnt+1
  302.     call    XMIT16
  303.     bit    flags,9        ; 8-byte response?
  304.     bbz    resres
  305.     lac    sumsn
  306.     call    XMIT16
  307.     lac    sumsn+1
  308.     call    XMIT16
  309. resres:    lac    flags
  310.     andk    0ff9fh        ; Reset 4- and 8-byte-response flags
  311.     sacl    flags
  312. waity    bioz    docomm        ; Get new command
  313.     b    waity
  314. ; Here when host wants to talk to us. Respond with R(eady)
  315. docomm:
  316.     ldpk    0
  317.     zac            ;Turn off interrupts
  318.     sacl    IMR
  319.     ldpk    12
  320. ; A little delay to let the host's serial port recover
  321. ; from the last XF pulse sent during sampling
  322.     lark    AR1,40
  323.     larp    AR1
  324. waitx    rptk    255        ;wait 25.6 usec
  325.     nop
  326.     banz    waitx,*-
  327.     lack    052h        ; Send the response char
  328.     call    XMIT
  329.     b    docmd
  330.  
  331. ;-----------------------------------------------------------------
  332. *
  333. * sinx/x correction coefficients
  334. *
  335. v1    .q14    -0.1049616
  336. v1-1    .q14    1.1049616
  337.  
  338. RINT:
  339. *
  340. * I/O the sample values
  341. *
  342.     ldpk    12
  343.     lac    xsamp
  344.     ldpk    0
  345.     sacl    DXR
  346.     lac    DRR
  347.     ldpk    12
  348.     sacl    rsamp
  349. *
  350. * Count down the start-up delay, if any
  351. *
  352.     lac    flags        ; Mark no delay happening
  353.     andk    0fffbh
  354.     sacl    flags
  355.     lac    sudly
  356.     bz    gori
  357.     subk    1
  358.     sacl    sudly
  359.     bz    gori
  360.     lac    flags        ; Mark delay happening
  361.     ork    4
  362.     sacl    flags
  363. gori:    lac    rvect
  364.     bacc
  365. *
  366. * Here to continue RINT processing for BER test
  367. *
  368. berri:
  369. *
  370. * Count down the trigger delay
  371. *
  372. trig:
  373.     lac    smpdly        ; Waiting for trigger?
  374.     bz    action        ; No
  375.     subk    1
  376.     sacl    smpdly
  377.     bnz    action
  378.     rxf
  379.     rptk    7
  380.     nop
  381.     sxf
  382.     bit    flags,13    ; In start-up delay?
  383.     bbnz    genbit        ; Yes
  384.     lac    flags
  385.     ork    8        ; Next sample is "it"
  386.     sacl    flags
  387.     b    genbit
  388. *
  389. * Check if we need to act on this sample
  390. *
  391. action:    bit    flags,13    ; Wait for start-up delay to finish
  392.     bbnz    genbit
  393.     bit    flags,12    ; Time to act?
  394.     bbz    genbit        ; Not yet!
  395.     lac    flags
  396.     andk    0fff7h        ; Reset action flag
  397.     sacl    flags
  398.     bit    flags,11    ; BER sampling?
  399.     bbz    nober
  400.     lac    rsamp        ; Save sign bit of input sample
  401.     sfl
  402.     sach    tmp1
  403.     lac    sdly        ; Get system sample delay count
  404.     addk    1
  405.     sfr            ; Divide by 4 (samples/bit)
  406.     sfr
  407.     neg
  408.     addk    31        ; # shifts
  409.     sacl    tmp0
  410.     lar    AR1,tmp0
  411.     larp    AR1
  412.     zalh    outbit
  413.     or    outbit+1
  414. bsft    sfl
  415.     banz    bsft,*-
  416.     ; Transmitted bit is in carry now
  417.     zac
  418.     bnc    ber1
  419.     lack    1
  420. ber1    xor    tmp1        ; Compare transmitted and received bits
  421.     andk    1
  422.     xor    invert
  423.     bnz    ber2
  424.     zalh    errcnt
  425.     or    errcnt+1
  426.     addk    1
  427.     sach    errcnt
  428.     sacl    errcnt+1
  429. ber2:    zalh    tcount        ; Decrement test count
  430.     or    tcount+1
  431.     subk    1
  432.     sach    tcount
  433.     sacl    tcount+1
  434.     bnz    genbit
  435.     lac    errcnt        ; End of BER test... report error count
  436.     ork    08000h
  437.     sacl    resp
  438.     lac    flags
  439.     andk    0ffefh        ; Reset BER flag
  440.     ork    020h        ; Set 4-byte-response flag
  441.     sacl    flags
  442.     b    genbit
  443. nober    bit    flags,14    ; Report sample value to host?
  444.     bbz    genbit        ; No
  445.     lac    rsamp
  446.     sacl    resp
  447.     lac    flags
  448.     andk    0fffdh        ; Reset report flag
  449.     sacl    flags
  450. genbit    lac    sstate        ;Count down sample states...
  451.     subk    1
  452.     sacl    sstate
  453.     bnz    bit0        ;states 1,2,3: 0 sample
  454.     lack    4
  455.     sacl    sstate
  456. ; Get the next data bit and insert into filter
  457. ; (1 = +1, 0 = -1)
  458.     bit    flags,15    ; Calib signal
  459.     bbnz    docal
  460.     bit    flags,8        ; Test signal?
  461.     bbnz    dotest
  462.     lac    sdly        ; Set trigger/action delay
  463.     andk    3
  464.     addk    1
  465.     sacl    smpdly
  466.     call    SCGEN        ;Get next random data bit
  467.     sacl    tmp0
  468.     zalh    outbit        ; Get shift reg of tx'd bits
  469.     or    outbit+1
  470.     sfl            ; Shift new bit into reg
  471.     or    tmp0
  472.     sach    outbit
  473.     sacl    outbit+1
  474.     lac    tmp0
  475.     bz    bit0
  476. bitp1    lalk    07fffh
  477.     b    out0
  478. bit0    zac
  479.     b    out0
  480. dotest    call    TESTGEN
  481.     bz    bit0
  482.     b    bitp1
  483. docal    call    CALGEN
  484.     bz    cbitm1
  485.     lac    sdly
  486.     sacl    smpdly
  487.     lalk    07fffh
  488.     b    out0
  489. cbitm1    zac
  490. ;cout0    call    rcfilt
  491. ;    sach    tmp1,1
  492. ;    b    outcor
  493. out0:
  494.     call    rcfilt    ;Run the raised-cosine filter
  495.     sach    tmp1,1
  496.     lac    tmp1
  497.     add    prnofs
  498.     sacl    tmp1,1
  499. *
  500. * sinx/x correction for F=38,400
  501. *
  502. outcor:    mac    v1-1,tmp1
  503.     zac
  504.     mac    v1,y1
  505.     apac
  506.     sach    y1,2
  507.     lac    y1
  508. finint:    andk    0fffch
  509.     or    clkcmd
  510.     sacl    xsamp
  511.     zac
  512. ;    lac    clkjit
  513. ;    xork    1
  514. ;    sacl    clkjit
  515.     sacl    clkcmd
  516.     eint
  517.     ret
  518. ******************************************************************
  519. AIC_2nd adlk    6,15            ;set ACCU_hi = 3 for secondary XMIT
  520.         idle                    ;Wait for a XINT
  521.         sach    DXR             ;
  522.         idle                    ;ACCU_hi requests 2nd XMIT
  523.         sacl    DXR             ;
  524.         idle                    ;ACCU_lo sets up registers
  525.         sacl    DXR,2           ;close command with LSB = 00
  526.         idle                    ;
  527.         eint                    ;
  528.         ret                     ;
  529. ;====================================================================
  530. *
  531. * Test signal generator. Returns 1 every other call.
  532. *
  533. TESTGEN:
  534.     lac    bstate
  535.     xork    1
  536.     sacl    bstate
  537.     andk    1
  538.     ret
  539. *
  540. * Calibration generator. Returns a 1 of each 18th call,
  541. * 0 or the other 8 calls.
  542. *
  543. CALGEN:
  544.     lac    bstate
  545.     bz    gen
  546.     subk    1
  547.     sacl    bstate
  548.     zac
  549.     ret
  550. gen:
  551.     lack    17
  552. ; lack 1
  553.     sacl    bstate
  554.     lack    1
  555.     ret
  556.  
  557. * Scrambler: Generates a PRN bit stream
  558. *
  559. * D1 XOR D12 XOR D17
  560. *
  561.     .ds
  562. sccnt    .word    0
  563.     .ps
  564. SCGEN:
  565. ;    lac    sccnt
  566. ;    xork    1
  567. ;    sacl    sccnt
  568. ;    andk    1
  569. ;    ret
  570.     zalh    shift
  571.     or    shift1
  572.     sfl
  573.     sach    shift
  574.     sacl    shift1
  575.     lac    shift1,4
  576.     sach    tmp1
  577.     lac    shift
  578.     sfr
  579.     xor    tmp1
  580.     xork    1
  581.     andk    1        ; bit is in LSB
  582.     or    shift1
  583.     sacl    shift1
  584.     andk    1    
  585.     ret
  586.  
  587. ; Raised-cosine filter
  588.  
  589.     .ds
  590. rcxn    .word    0,0,0,0,0,0,0,0,0,0
  591.     .word    0,0,0,0,0,0,0,0,0,0
  592.     .word    0,0,0,0,0,0,0,0,0,0
  593.     .word    0,0,0,0,0,0
  594.  
  595. ; Filter coefficients
  596.  
  597.     .ps
  598.     .include "rcfilt72.asm"
  599. ;    .include "pulse.dat"
  600.     
  601. ; 36-TAP FIR FILTER CODE
  602. ; NOTE THAT THE DATA MUST BE IN INTERNAL MEMORY
  603.  
  604. rcfilt    larp    3
  605.     lrlk    3,rcxn
  606.     sacl    *
  607.     adrk    35
  608.     mac    rch0,*-
  609.     zac
  610.     rptk    34
  611.     macd    rch1,*-
  612.     apac
  613. ; RESULT IS IN HIGH ACCUM
  614.     ret
  615.  
  616. ; Serial I/O subroutines
  617.  
  618.     .ds
  619. TEMPx    .word    0
  620. WORD16    .word    0
  621.     .ps
  622. ;============================================================
  623. ; RECV returns word in bottom 8 bits of ACCL
  624. ;============================================================
  625. RECV16: call    RECV            ;recv LO
  626.         sacl    WORD16          ;
  627.         call    RECV            ;recv HI
  628.         rptk    7               ;
  629.         sfl                     ;build HI+LO
  630.         or      WORD16          ;
  631.     sacl    WORD16          ;
  632.     ret                     ;
  633.     ;------------------------
  634. ;============================================================
  635. ; XMIT assumes word is in bottom 8 bits of ACCL
  636. ;============================================================
  637. XMIT16: call    XMIT            ;xmit LO
  638.     call    XMIT            ;xmit HI
  639.     ret                     ;
  640. RECV    ldpk    0
  641.     call    DRECV
  642.     ldpk    12
  643.     ret
  644. XMIT    ldpk    0
  645.     call    DXMIT
  646.     ldpk    12
  647.     ret
  648.  
  649. ; Interrupt processing for SINAD measurement
  650.  
  651. ; Constants for sine-wave oscillator
  652. gc1    .q14    1.8941882
  653. m1    .q14    -1
  654. *
  655. * Constants for the notch filter
  656. *
  657.     .ds
  658. ninsf    .q13    0.00195    ; Input scale factor
  659. ; First second-order section
  660. a11    .q13    -1.8964
  661. a12    .q13    1
  662. b11    .q13    1.8751
  663. b12    .q13    -0.9795
  664. ; Second second-order section
  665. a21    .q13    -1.8924
  666. a22    .q13    1
  667. b21    .q13    1.8909
  668. b22    .q13    -0.9900
  669. ; Third second-order section
  670. a31    .q13    -1.8944
  671. a32    .q13    1
  672. b31    .q13    1.8782
  673. b32    .q13    -0.9894
  674.  
  675. d1    .word    0
  676. d1m1    .word    0
  677. d1m2    .word    0
  678. d2    .word    0
  679. d2m1    .word    0
  680. d2m2    .word    0
  681. d3    .word    0
  682. d3m1    .word    0
  683. d3m2    .word    0
  684. sumsn    .word    0
  685. sumsn+1    .word    0
  686. sumn    .word    0
  687. sumn+1    .word    0
  688.     .ps
  689.  
  690. sinadi:    lac    sstate
  691.     xork    1
  692.     andk    1
  693.     sacl    sstate
  694.     bz    finint
  695. *
  696. * Generate the sine wave via oscillator
  697. *
  698.     ssxm
  699.     mac    m1,g-2
  700.     zac
  701.     macd    gc1,g-1
  702.     apac
  703.     sach    g-1,2
  704.     sach    tmp1,2
  705. *
  706. * Notch the input signal
  707. *
  708.     lt    rsamp
  709.     mpy    ninsf
  710.     pac
  711.     lt    d1m1
  712.     mpy    b11
  713.     lta    d1m2
  714.     mpy    b12
  715.     apac
  716.     sach    d1,3        ;Store in Q15 format
  717.     mpy    a12
  718.     ltd    d1m1
  719.     mpy    a11
  720.     dmov    d1
  721.     apac
  722. ;
  723.     lt    d2m1
  724.     mpy    b21
  725.     lta    d2m2
  726.     mpy    b22
  727.     apac
  728.     sach    d2,3        ;Store in Q15 format
  729.     mpy    a22
  730.     ltd    d2m1
  731.     mpy    a21
  732.     dmov    d2
  733.     apac
  734. ;
  735.     lt    d3m1
  736.     mpy    b31
  737.     lta    d3m2
  738.     mpy    b32
  739.     apac
  740.     sach    d3,3        ;Store in Q15 format
  741.     mpy    a32
  742.     ltd    d3m1
  743.     mpy    a31
  744.     dmov    d3
  745.     apac
  746.     sfl
  747.     sfl
  748.     sfl
  749.     sfl
  750.     sfl
  751.     sach    d1,7        ; Filter output sample
  752.     bit    flags,13    ; In start-up delay?
  753.     bbnz    outcor        ; Yes, done
  754. *
  755. * Sum the squares of the sample values
  756. *
  757.     lt    rsamp        ; Sum input signal (s+n)
  758.     mpy    rsamp
  759.     pac
  760.     rptk    11
  761.     sfr
  762.     adds    sumsn+1
  763.     addh    sumsn
  764.     sach    sumsn
  765.     sacl    sumsn+1
  766.     lt    d1        ; Sum filtered signal (n)
  767.     mpy    d1
  768.     pac
  769.     rptk    11
  770.     sfr
  771.     adds    sumn+1
  772.     addh    sumn
  773.     sach    sumn
  774.     sacl    sumn+1
  775. *
  776. * Check for end of test
  777. *
  778.     lac    tcount        ; Decrement test count
  779.     bz    outcor
  780.     subk    1
  781.     sacl    tcount
  782.     bnz    outcor        ; Keep going
  783.     lac    sumn
  784.     ork    08000h
  785.     sacl    resp
  786.     lac    sumn+1
  787.      sacl    errcnt+1
  788.      lac    flags        ; Note 8-byte response
  789.      ork    060h
  790.      sacl    flags
  791.     b    outcor
  792.